package it.rap.applications.persistence.entities.movimento;

import it.rap.applications.persistence.entities.contoCorrente.ContoCorrente;
import it.rap.applications.persistence.entities.filters.FilterTree;
import it.rap.applications.persistence.entities.ricevuta.Ricevuta;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQuery;
import javax.persistence.OneToOne;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@SqlResultSetMapping(
		  name="archive-map",
		  entities={
		    @EntityResult(
		      entityClass=Saldo.class,
		      fields={
		        @FieldResult(name="saldo", column="saldo"),
		        @FieldResult(name="totaleAccrediti", column="totaleAccrediti"),
		        @FieldResult(name="totaleAddebiti", column="totaleAddebiti")
		        })})
		
		
@NamedNativeQuery(name="calcoloSaldo", query="SELECT ( IFNULL( SUM(accredito), 0 ) - IFNULL( SUM(addebito), 0) ) as saldo, IFNULL( SUM(accredito), 0 ) as totaleAccrediti, IFNULL( SUM(addebito), 0) as totaleAddebiti FROM MOVIMENTO m ", resultSetMapping="archive-map")

@Entity
public class Movimento {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Float idMovimento;
	@Temporal(value = TemporalType.DATE)
	private Date dataContabile;
	@Temporal(value = TemporalType.DATE)
	private Date dataValuta;
	private Float addebito;
	private Float accredito;
	private String descrizione;

	private String descrizioneCompleta;
	
	@ManyToOne(optional = true)
	private ContoCorrente contoCorrente;

	@OneToOne(optional=true)
	private Ricevuta ricevuta;
	
	public Movimento(){
		
	}
	public Movimento(Float idMovimento, Date dataContabile, Date dataValuta, Float accredito, Float addebito, String descrizione, String descrizioneCompleta) {
		super();
		this.idMovimento = idMovimento;
		this.dataContabile = dataContabile;
		this.dataValuta = dataValuta;		
		this.accredito = accredito;
		this.addebito = addebito;
		this.descrizione = descrizione;
		this.descrizioneCompleta = descrizioneCompleta;
	}
	public Float getIdMovimento() {
		return idMovimento;
	}
	public void setIdMovimento(Float idMovimento) {
		this.idMovimento = idMovimento;
	}
	public Date getDataContabile() {
		return dataContabile;
	}
	public void setDataContabile(Date dataContabile) {
		this.dataContabile = dataContabile;
	}
	public Date getDataValuta() {
		return dataValuta;
	}
	public void setDataValuta(Date dataValuta) {
		this.dataValuta = dataValuta;
	}
	public Float getAddebito() {
		return addebito;
	}
	public void setAddebito(Float addebito) {
		this.addebito = addebito;
	}
	public Float getAccredito() {
		return accredito;
	}
	public void setAccredito(Float accredito) {
		this.accredito = accredito;
	}
	public String getDescrizione() {
		return descrizione;
	}
	public void setDescrizione(String descrizione) {
		this.descrizione = descrizione;
	}
	public String getDescrizioneCompleta() {
		return descrizioneCompleta;
	}
	public void setDescrizioneCompleta(String descrizioneCompleta) {
		this.descrizioneCompleta = descrizioneCompleta;	
	}
	public ContoCorrente getContoCorrente() {
		return contoCorrente;
	}
	public void setContoCorrente(ContoCorrente contoCorrente) {
		this.contoCorrente = contoCorrente;
	}
	public String toString(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		StringBuffer mov = new StringBuffer();
		mov.append("ID:").append( idMovimento==null?"":idMovimento ).append(" | ");
		mov.append("DC:").append( dataContabile==null?"":sdf.format( dataContabile )).append(" | ");
		mov.append("DV:").append( dataValuta==null?"":sdf.format( dataValuta )).append(" | ");
		mov.append("AC:").append( accredito==null?"":accredito ).append(" | ");
		mov.append("AD:").append( addebito==null?"":addebito ).append(" | ");
		mov.append("DE:").append( descrizione==null?"":descrizione ).append(" | ");		
		mov.append("DC:").append( descrizioneCompleta==null?"":descrizioneCompleta.substring(0, descrizioneCompleta.length()>15?15:descrizioneCompleta.length() ) ).append("...").append(" | ").append("\n");
		return mov.toString();
	}
	/**
	 * @return the ricevuta
	 */
	public Ricevuta getRicevuta() {
		return ricevuta;
	}
	/**
	 * @param ricevuta the ricevuta to set
	 */
	public void setRicevuta(Ricevuta ricevuta) {
		this.ricevuta = ricevuta;
	}
}
